package com.example.concurrent.demo.atomic;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
 * @author susc
 * @title: AtomicIntegerFieldUpdater
 * @projectName concurrent-demo
 * @description: 如果需要原子更新某个类的某个字段时，需要用到对象的属性修改类型的原子类
 * AtomicIntegerFieldUpdater:原子更新整形字段的更新器
 *
 * AtomicLongFieldUpdater：原子更新长整形字段的更新器
 *
 * AtomicStampedReference ：原子更新带有版本号的引用类型。该类将整数值与引用关联起来，可用于解决原子的更新数据和数据的版本号，可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
 * @date 2021/9/2815:30
 */
public class AtomicIntegerFieldUpdaterTest {

    public static void main(String[] args) {
        AtomicIntegerFieldUpdater<User> userUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class,"age" );
        User user = new User("Java", 22);
        System.out.println(userUpdater.getAndIncrement(user));
        System.out.println(userUpdater.get(user));

    }


}

class User {
    private String name;
    public volatile int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}